"""
文件处理工具模块扩展
"""
import os
import logging
import pandas as pd
import json
from datetime import datetime

logger = logging.getLogger(__name__)

class FileUtilsExt:
    """文件处理工具扩展类"""
    
    @staticmethod
    def read_json(file_path, **kwargs):
        """
        读取JSON文件
        
        Args:
            file_path: 文件路径
            **kwargs: pandas.read_json的其他参数
        
        Returns:
            pandas.DataFrame: 读取的数据
        """
        try:
            # 设置默认参数
            default_params = {
                'orient': 'records',
                'encoding': 'utf-8'
            }
            
            # 合并参数
            params = {**default_params, **kwargs}
            
            # 读取JSON文件
            df = pd.read_json(file_path, **params)
            return df
        except Exception as e:
            logger.error(f"读取JSON文件失败: {str(e)}")
            raise
    
    @staticmethod
    def write_json(df, file_path, **kwargs):
        """
        写入JSON文件
        
        Args:
            df: DataFrame
            file_path: 文件路径
            **kwargs: pandas.to_json的其他参数
        
        Returns:
            bool: 是否成功
        """
        try:
            # 设置默认参数
            default_params = {
                'orient': 'records',
                'date_format': 'iso',
                'indent': 2
            }
            
            # 合并参数
            params = {**default_params, **kwargs}
            
            # 确保目录存在
            os.makedirs(os.path.dirname(os.path.abspath(file_path)), exist_ok=True)
            
            # 写入JSON文件
            df.to_json(file_path, **params)
            return True
        except Exception as e:
            logger.error(f"写入JSON文件失败: {str(e)}")
            raise
    
    @staticmethod
    def read_parquet(file_path, **kwargs):
        """
        读取Parquet文件
        
        Args:
            file_path: 文件路径
            **kwargs: pandas.read_parquet的其他参数
        
        Returns:
            pandas.DataFrame: 读取的数据
        """
        try:
            # 读取Parquet文件
            df = pd.read_parquet(file_path, **kwargs)
            return df
        except Exception as e:
            logger.error(f"读取Parquet文件失败: {str(e)}")
            raise
    
    @staticmethod
    def write_parquet(df, file_path, **kwargs):
        """
        写入Parquet文件
        
        Args:
            df: DataFrame
            file_path: 文件路径
            **kwargs: pandas.to_parquet的其他参数
        
        Returns:
            bool: 是否成功
        """
        try:
            # 设置默认参数
            default_params = {
                'index': False,
                'compression': 'snappy'
            }
            
            # 合并参数
            params = {**default_params, **kwargs}
            
            # 确保目录存在
            os.makedirs(os.path.dirname(os.path.abspath(file_path)), exist_ok=True)
            
            # 写入Parquet文件
            df.to_parquet(file_path, **params)
            return True
        except Exception as e:
            logger.error(f"写入Parquet文件失败: {str(e)}")
            raise
    
    @staticmethod
    def get_file_info(file_path):
        """
        获取文件信息
        
        Args:
            file_path: 文件路径
        
        Returns:
            dict: 文件信息
        """
        try:
            # 获取文件状态
            stat = os.stat(file_path)
            
            # 获取文件信息
            file_info = {
                'name': os.path.basename(file_path),
                'path': os.path.abspath(file_path),
                'size': stat.st_size,
                'create_time': datetime.fromtimestamp(stat.st_ctime).strftime('%Y-%m-%d %H:%M:%S'),
                'modify_time': datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M:%S'),
                'access_time': datetime.fromtimestamp(stat.st_atime).strftime('%Y-%m-%d %H:%M:%S'),
                'extension': os.path.splitext(file_path)[1].lower(),
            }
            
            return file_info
        except Exception as e:
            logger.error(f"获取文件信息失败: {str(e)}")
            raise
    
    @staticmethod
    def list_files(directory, pattern=None, recursive=False):
        """
        列出目录中的文件
        
        Args:
            directory: 目录路径
            pattern: 文件名模式 (可选)
            recursive: 是否递归查找
        
        Returns:
            list: 文件路径列表
        """
        import fnmatch
        
        try:
            result = []
            
            if recursive:
                # 递归查找
                for root, _, files in os.walk(directory):
                    for file in files:
                        if pattern is None or fnmatch.fnmatch(file, pattern):
                            result.append(os.path.join(root, file))
            else:
                # 只查找当前目录
                for file in os.listdir(directory):
                    file_path = os.path.join(directory, file)
                    if os.path.isfile(file_path) and (pattern is None or fnmatch.fnmatch(file, pattern)):
                        result.append(file_path)
            
            return result
        except Exception as e:
            logger.error(f"列出文件失败: {str(e)}")
            raise
    
    @staticmethod
    def ensure_directory(directory):
        """
        确保目录存在
        
        Args:
            directory: 目录路径
        
        Returns:
            bool: 是否成功
        """
        try:
            os.makedirs(directory, exist_ok=True)
            return True
        except Exception as e:
            logger.error(f"创建目录失败: {str(e)}")
            raise
    
    @staticmethod
    def move_file(source, destination):
        """
        移动文件
        
        Args:
            source: 源文件路径
            destination: 目标文件路径
        
        Returns:
            bool: 是否成功
        """
        import shutil
        
        try:
            # 确保目标目录存在
            os.makedirs(os.path.dirname(os.path.abspath(destination)), exist_ok=True)
            
            # 移动文件
            shutil.move(source, destination)
            return True
        except Exception as e:
            logger.error(f"移动文件失败: {str(e)}")
            raise
    
    @staticmethod
    def copy_file(source, destination):
        """
        复制文件
        
        Args:
            source: 源文件路径
            destination: 目标文件路径
        
        Returns:
            bool: 是否成功
        """
        import shutil
        
        try:
            # 确保目标目录存在
            os.makedirs(os.path.dirname(os.path.abspath(destination)), exist_ok=True)
            
            # 复制文件
            shutil.copy2(source, destination)
            return True
        except Exception as e:
            logger.error(f"复制文件失败: {str(e)}")
            raise
    
    @staticmethod
    def delete_file(file_path):
        """
        删除文件
        
        Args:
            file_path: 文件路径
        
        Returns:
            bool: 是否成功
        """
        try:
            if os.path.exists(file_path):
                os.remove(file_path)
            return True
        except Exception as e:
            logger.error(f"删除文件失败: {str(e)}")
            raise
    
    @staticmethod
    def read_text_file(file_path, encoding='utf-8'):
        """
        读取文本文件
        
        Args:
            file_path: 文件路径
            encoding: 编码
        
        Returns:
            str: 文件内容
        """
        try:
            with open(file_path, 'r', encoding=encoding) as f:
                return f.read()
        except Exception as e:
            logger.error(f"读取文本文件失败: {str(e)}")
            raise
    
    @staticmethod
    def write_text_file(content, file_path, encoding='utf-8'):
        """
        写入文本文件
        
        Args:
            content: 文件内容
            file_path: 文件路径
            encoding: 编码
        
        Returns:
            bool: 是否成功
        """
        try:
            # 确保目录存在
            os.makedirs(os.path.dirname(os.path.abspath(file_path)), exist_ok=True)
            
            with open(file_path, 'w', encoding=encoding) as f:
                f.write(content)
            return True
        except Exception as e:
            logger.error(f"写入文本文件失败: {str(e)}")
            raise